#ifndef __CAN_OTA_H__
#define __CAN_OTA_H__

#include "n32g430.h"

/* CAN OTA 相关定义 */
#define CAN_OTA_CMD_ID    0x400   // 命令帧ID
#define CAN_OTA_RESP_ID   0x500   // 应答帧ID
#define CAN_OTA_DATA_ID   0x600   // 数据帧ID

/* CAN OTA 命令定义 */
#define CAN_OTA_CMD_START       0xA0   // 开始升级
#define CAN_OTA_CMD_DATA        0xA1   // 数据传输
#define CAN_OTA_CMD_END         0xA2   // 结束升级
#define CAN_OTA_CMD_ABORT       0xA3   // 中止升级
#define CAN_OTA_CMD_VERIFY      0xA4   // 校验固件
#define CAN_OTA_CMD_BLOCK_START 0xA5   // 数据块开始
#define CAN_OTA_CMD_BLOCK_END   0xA6   // 数据块结束

/* CAN OTA 响应定义 */
#define CAN_OTA_RESP_OK      0x00  // 成功
#define CAN_OTA_RESP_ERROR   0x01  // 错误
#define CAN_OTA_RESP_READY   0x02  // 准备就绪
#define CAN_OTA_RESP_VERIFY  0x03  // 验证成功
#define CAN_OTA_RESP_RETRY   0x04  // 请求重传

/* 数据块相关定义 */
#define MAX_BLOCK_SIZE     2048    // 最大数据块大小
#define MAX_PACKETS_PER_BLOCK 256  // 每个数据块最大包数 (2048/8=256)

/* 设备ID相关定义 */
#define DEVICE_ID_MASK      0x0F    // 设备ID掩码(支持16个设备)
#define DEVICE_BASE_ID      0x400   // 基础ID

/* ID生成宏 */
#define GET_CMD_ID(device_id)    (CAN_OTA_CMD_ID + (device_id & DEVICE_ID_MASK))
#define GET_DATA_ID(device_id)   (CAN_OTA_DATA_ID + (device_id & DEVICE_ID_MASK))
#define GET_RESP_ID(device_id)   (CAN_OTA_RESP_ID + (device_id & DEVICE_ID_MASK))
#define GET_DEVICE_ID(can_id)    ((can_id - DEVICE_BASE_ID) & DEVICE_ID_MASK)

/* CAN OTA配置结构体 */
typedef struct {
    uint8_t device_id;      // 设备ID
    uint8_t group_id;       // 组ID，用于组播升级
    uint8_t is_master;      // 是否为主设备
} CAN_OTA_Config;

/* CAN OTA 数据包结构定义 */
typedef struct {
    uint8_t  cmd;       // 命令类型
    uint8_t  seq;       // 序列号
    uint16_t flags;     // 标志位
    uint32_t param;     // 参数
} CAN_OTA_Cmd;

typedef struct {
    uint8_t  data[8];   // 数据
} CAN_OTA_Data;

typedef struct {
    uint16_t index;     // 应答包索引
    uint8_t  status;    // 状态
    uint8_t  reserved[5]; // 保留
} CAN_OTA_Response;



/* 函数声明 */
void CAN_OTA_Init(CAN_OTA_Config *config);
void CAN_OTA_HandleMessage(uint32_t id, uint8_t *data, uint8_t len);
uint8_t CAN_OTA_SendResponse(uint16_t index, uint8_t status);

#endif /* __CAN_OTA_H__ */ 